package site.xuqing.nobean.obj;

import java.util.List;
import java.util.Map;

/**
 * @author xuqing
 * @Description 数据对象模板
 * @createTime 2022年01月19日 14:37:54
 */
public interface INonObject {
    /**
     * 获取对应key的value
     *
     * @param key key
     * @param <T> value的类型
     * @return value
     */
    <T> T getValue(String key);
    
    /**
     * 获取对象中可查找到该key的对象，
     * 1.如果能查找到，当对象中key唯一时可获取到一个值
     * 2.当对象key非唯一时可获取到key的第一个对象
     * 3.不建议key非唯一时使用，可能会取不到真正需要的字段
     * 4.当前对象未找到时会查找下级对象中的字段，不查找下级对象列表中的对象字段
     *
     * @param key key
     * @param <T> value的类型
     * @return value
     */
    <T> T findableValue(String key);
    
    /**
     * 获取当前对象的键值对存储Map
     *
     * @return Map<String, Object>
     */
    Map<String, Object> getFieldMap();
    
    /**
     * 设置键值对
     *
     * @param key   key
     * @param value value
     * @param <T>   value的类型
     * @return INonObject
     */
    <T> INonObject setValue(String key, T value);
    
    /**
     * 获取对应key的对象
     *
     * @param key key
     * @return NonObject对象
     */
    INonObject getObject(String key);
    
    /**
     * 获取对象中可查找到该key的对象，
     * 1.如果能查找到，当对象中key唯一时可获取到一个值
     * 2.当对象key非唯一时可获取到key的第一个对象
     * 3.不建议key非唯一时使用，可能会取不到真正需要的字段
     * 4.当前对象未找到时会查找下级对象中的字段，不查找下级对象列表中的对象字段
     *
     * @param key key
     * @return NonObject对象
     */
    INonObject findableObject(String key);
    
    /**
     * 获取当前对象的对象存储Map
     *
     * @return Map<String, INonObject>
     */
    Map<String, INonObject> getObjectMap();
    
    /**
     * 设置键对象对
     *
     * @param key    key
     * @param object NonObject对象
     * @return INonObject
     */
    INonObject setObject(String key, INonObject object);
    
    /**
     * 获取对应key的列表
     *
     * @param key key
     * @return NonObject列表
     */
    List<INonObject> getList(String key);
    
    /**
     * 获取当前对象的列表存储Map
     *
     * @return Map<String, List < INonObject>>
     */
    Map<String, List<INonObject>> getListMap();
    
    /**
     * 设置键列表对
     *
     * @param key  key
     * @param list NonObject列表
     * @return INonObject
     */
    INonObject setList(String key, List<INonObject> list);
    
    /**
     * 清除内存
     */
    void clear();
}
